FALLOCATE(2) | Linux Programmer's Manual | FALLOCATE(2) |
名前¶
fallocate - ファイル空間の操作
書式¶
#define _GNU_SOURCE #include <fcntl.h> int fallocate(int fd, int mode, off_t offset, off_t len);
説明¶
このシステムコールは、移植性のない、Linux 固有のシステムコールである。 移植性が必要な場合は、ファイルに対してディスク空間を確実に確保するために、 POSIX.1 で規定された方法である posix_fallocate(3) を使うこと。
fallocate() を使うと、 fd が参照するファイルに割り当てられたディスク空間を直接操作できる。 操作対象は、 offset から始まる長さ len バイトの領域である。
mode 引き数は、指定された領域に対して実行する操作を指定する。 現在のところ、 mode に指定できるフラグは以下の一つだけである。
- FALLOC_FL_KEEP_SIZE
- このフラグは、 offset と len で指定された領域のディスク空間を割り当て、その空間を 0 で初期化する。 呼び出しが成功すると、それに続いてこの領域への書き込みが行われるが、 ディスク空間の不足による書き込み失敗が発生しないことが保証される。 ファイル末尾より後ろの領域について 0 で埋めたブロックを前もって 割り当てておくことは、追記 (append) の作業負荷を最適化するのに 有用である。 ファイルサイズが offset+len よりも小さい場合であっても、ブロックの前もっての割り当てにより (stat(2) が返す) ファイルサイズは変更されることはない。
FALLOC_FL_KEEP_SIZE フラグが mode に指定されなかった場合、デフォルトの動作は FALLOC_FL_KEEP_SIZE フラグが指定された場合とほとんど同じとなる。 唯一の違いは、 offset + len がファイルサイズよりも大きかった場合、呼び出しが成功すると ファイルサイズが変更される点である。 このデフォルトの動作は、ライブラリ関数 posix_fallocate(3) の動作と非常に似ている。これは posix_fallocate(3) を最適に実装する手段を提供することを目的としているからである。
割り当てはブロックサイズ単位で行われるため、 fallocate() は指定されたよりも大きな領域を割り当てることがある。
返り値¶
fallocate() は成功すると 0 を返し、エラーの場合は -1 を返す。
エラー¶
- EBADF
- fd が有効なファイルディスクリプタでないか、 書き込み用としてオープンされていない。
- EFBIG
- offset + len がファイルサイズの最大値よりも大きい。
- EINTR
- 実行中にシグナルが捕捉された。
- EINVAL
- offset が 0 未満であるか、 len が 0 以下である。
- EIO
- ファイルシステムとの読み書き中に入出力エラーが発生した。
- ENODEV
- fd が通常のファイルかディレクトリを参照していない (fd がパイプや FIFO を参照している場合、別のエラーが発生する)。
- ENOSPC
- fd が参照するファイルを含むデバイスに十分な空き領域がない。
- ENOSYS
- fd が参照するファイルを含むファイルシステムが 指定された操作をサポートしていない。
- EOPNOTSUPP
- fd が参照するファイルを含むファイルシステムが mode をサポートしていない。
バージョン¶
fallocate() はカーネル 2.6.23 以降の Linux で利用可能である。 glibc での対応はバージョン 3.10 以降で行われている。
準拠¶
fallocate() は Linux 固有である。
関連項目¶
2009-03-13 | Linux |